package com.example.config;

import com.example.common.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理器
 * 作用：统一处理Controller层抛出的异常，返回统一的错误格式
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 处理业务异常
     * @param e 业务异常
     * @return 统一错误响应
     *
     * @ExceptionHandler: 指定处理的异常类型
     * 这里处理RuntimeException及其子类，包括我们抛出的业务异常
     */
    @ExceptionHandler(RuntimeException.class)
    public Result<Object> handleBusinessException(RuntimeException e) {
        // 记录错误日志
        logger.error("业务异常: {}", e.getMessage(), e);

        // 返回统一的错误格式
        // 401表示未授权（用户名密码错误）
        // 实际项目中可以根据异常类型返回不同的状态码
        return Result.error(401, e.getMessage());
    }

    /**
     * 处理参数验证异常
     * @param e 参数异常
     * @return 统一错误响应
     */
    @ExceptionHandler(IllegalArgumentException.class)
    public Result<Object> handleIllegalArgumentException(IllegalArgumentException e) {
        logger.warn("参数验证异常: {}", e.getMessage());
        return Result.error(400, e.getMessage()); // 400表示客户端请求错误
    }

    /**
     * 处理所有其他异常
     * @param e 异常
     * @return 统一错误响应
     */
    @ExceptionHandler(Exception.class)
    public Result<Object> handleException(Exception e) {
        logger.error("系统异常: {}", e.getMessage(), e);
        return Result.error(500, "系统繁忙，请稍后重试"); // 500表示服务器内部错误
    }
}